Conjunto de dados utilizado

Análise exploratória de dados do Spotify sobre os álbuns e músicas de Jackson do Pandeiro Streaming. Os dados originais e as variáveis vêm deste repositorio . A explicação de como os dados foram gerados está disponível na documentação da API do Spotify.

Considerações

Na análise abaixo foi possível perceber:

  • Como a fala não é a grande questão na dançabilidade das músicas de Jackson, o que era de se esperar do Rei do Ritmo.
  • Vimos como no Spotify a maior parte dos álbuns são remasterizados/relançados e estes são os mais populares.
  • Foi possível vislumbrar a incrível diversidade do cantor que nos foi reafirmada em termos de notas musicais e de duração.
  • Por fim, foi possível perceber como o tom e mesmo a duração das faixas de Jackson não representam somente a incrível diversidade de sua música, mas também refletem sua vida pessoal. Um evento de natureza pessoal afeta visivelmente o tom de sua música.

Data Overview

data <- read_csv(here::here("data/jackson.csv"), 
                            col_types = cols(
                                .default = col_double(),
                                album_uri = col_character(),
                                album_name = col_character(),
                                album_img = col_character(),
                                album_release_date = col_character(),
                                album_release_year = col_date(format = ""),
                                album_popularity = col_integer(),
                                track_name = col_character(),
                                track_uri = col_character(),
                                key = col_character(),
                                mode = col_character(),
                                time_signature = col_integer(),
                                key_mode = col_character(),
                                track_popularity = col_integer()
                                )) %>%
         mutate(album_name = gsub(".*(1954).*",
                                         "The Music of Brazil/Jackson do Pandeiro",
                                  album_name));
data %>% 
    glimpse()
Observations: 500
Variables: 23
$ album_uri          <chr> "5T9tTjPIfjbUJGRJdYOOLl", "5T9tTjPIfjbUJGRJdYOOLl", "5T9tTjPIfjb...
$ album_name         <chr> "Jackson Do Pandeiro Volume 1: Tum, Tum, Tum!", "Jackson Do Pand...
$ album_img          <chr> "https://i.scdn.co/image/5dcc4a0cad740f1ee0774196d0a14f3693ef887...
$ album_release_date <chr> "1958-11-11", "1958-11-11", "1958-11-11", "1958-11-11", "1958-11...
$ album_release_year <date> 1958-11-11, 1958-11-11, 1958-11-11, 1958-11-11, 1958-11-11, 195...
$ album_popularity   <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ track_name         <chr> "Tum, Tum, Tum", "Pacífico Pacato", "Nortista Quatrocentão", "Se...
$ track_uri          <chr> "6cCYhV6fU68uzbjWPG9V7x", "6Gu7y9SgtVTGh8YGhDPtCe", "1hq7M7cJtvD...
$ danceability       <dbl> 0.501, 0.663, 0.550, 0.447, 0.544, 0.571, 0.495, 0.572, 0.500, 0...
$ energy             <dbl> 0.987, 0.962, 0.947, 0.969, 0.972, 0.926, 0.967, 0.986, 0.947, 0...
$ key                <chr> "A", "F", "D", "G", "E", "F", "E", "C", "F", "A#", "E", "F", "D#...
$ loudness           <dbl> 2.561, 1.137, 1.621, 2.743, 2.513, 2.414, 2.375, 2.597, 3.078, 3...
$ mode               <chr> "major", "major", "major", "major", "minor", "major", "minor", "...
$ speechiness        <dbl> 0.0429, 0.1810, 0.0469, 0.0549, 0.0502, 0.0344, 0.0576, 0.0367, ...
$ acousticness       <dbl> 0.718, 0.738, 0.666, 0.759, 0.787, 0.651, 0.712, 0.194, 0.286, 0...
$ instrumentalness   <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ liveness           <dbl> 0.282, 0.200, 0.251, 0.333, 0.176, 0.342, 0.321, 0.301, 0.323, 0...
$ valence            <dbl> 0.963, 0.961, 0.923, 0.899, 0.783, 0.961, 0.755, 0.989, 0.957, 0...
$ tempo              <dbl> 101.676, 113.562, 116.125, 116.023, 112.863, 133.065, 117.822, 1...
$ duration_ms        <dbl> 158133, 139773, 163173, 143733, 151653, 157480, 158133, 154680, ...
$ time_signature     <int> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4...
$ key_mode           <chr> "A major", "F major", "D major", "G major", "E minor", "F major"...
$ track_popularity   <int> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0...

Dançabilidade (danceability)

data %>% 
    ggplot(aes(sample=danceability)) + 
        stat_qq()

hchart (data$danceability,
        color = "#B71C1C",
        name = "Dançabilidade")
  • Nenhum valor fora do domínio dos valores, a dançabilidade parece girar em torno de 0.6 e 0.7.

Verbosidade (speechines)

data %>% 
    ggplot(aes(sample=speechiness)) + 
        stat_qq()

hchart (data$speechiness,
        color = "#B71C1C",
        name = "Verbosidade")
  • Nenhum valor fora do domínio dos valores. A verbosidade é em geral baixa, observando a música de Jackson o ritmo parece ser a questão principal, com letras curtas e quase repetitivas.

Duração (duration)

data <- data %>%
    mutate(duration_s = duration_ms/1000)
data %>% 
    select(duration_s) %>%
    glimpse()
Observations: 500
Variables: 1
$ duration_s <dbl> 158.133, 139.773, 163.173, 143.733, 151.653, 157.480, 158.133, 154.680, ...
data %>% 
    ggplot(aes(sample=duration_s)) + 
        stat_qq()

hchart (data$duration_s,
        color = "#B71C1C",
        name = "Duração (s)")
  • Nenhum valor fora do domínio dos valores. As músicas giram em torno de 160 segundos (2 minutos e 40 segundos), as músicas de Jackson são em geral curtas.

Remasterização (remaster)

data <- data %>%
    mutate(remaster = album_release_date > "1981-30-12")
data %>% 
    select(album_name, album_release_year, remaster) %>%
    sample_n(10)
temp <- data %>% 
    distinct(album_name,
             .keep_all = TRUE) %>%
    mutate(remaster = ifelse(remaster == TRUE,"remasterizado","original"))
hchart(temp$remaster,
       colorByPoint = TRUE,
       name="Álbum")
  • Álbuns remasterizados/relançados são muito mais frequentes.
temp <-
    data %>% 
    distinct(album_name, .keep_all = TRUE) %>%
    group_by(album_release_year) %>%
    summarise(original_n = sum(!remaster),
              remaster_n = sum(remaster))
highchart() %>%
  hc_xAxis(categories = temp$album_release_year) %>%
  hc_add_series(temp$original_n, 
                type = "column",
                color = "#B71C1C",
                name = "Não remasterizado") %>%
  hc_add_series(temp$remaster_n, 
                type = "column",
                name = "Remasterizado")  %>%
      hc_title(text = "Número de álbuns por ano")
  • O ano de 2016 representa um aumento altíssimo na disponibilização de álbuns de Jackson no Spotify.

Mais discurso/diálogo (speechines) tem efeito sobre a dançabilidade da música?

p <- data %>% 
        distinct(track_name, .keep_all = TRUE) %>%
        ggplot(aes(x=speechiness,
                   y=danceability)) +
        geom_point(alpha=0.4) 
ggplotly(p)


Não parece haver uma relação clara entre a dançabilidade das músicas de Jackson e a verbosidade de suas músicas. Temos muitas faixas de diferente grau de dançabilidade de mesmo grau baixo de verbosidade.
Quando aumentamos a verbosidade das músicas (mais à direita no eixo) a dançabilidade se mantém relativamente estável (O aumento na dançabilidade é marginal).

data %>% 
    distinct(track_name, .keep_all = TRUE) %>%
    ggplot(aes(speechiness,danceability)) +
    stat_density2d(aes(fill = ..level..), geom = "polygon") +
    scale_x_continuous(breaks = seq(0,1,0.01))


É possível ver mais claramente que o ponto de maior ocorrência (cume ou ponto de level mais alto) é em em torno de 0.7 de dançabilidade e de aproximadamente 0.04 (valores muito baixo de verbosidade).
Isso implica em algo já esperado, Jackson não precisa falar muito pra tornar suas músicas dançantes, não é a toa que Jackson ganhou a alcunha de Rei do Ritmo.

  • O aumento em verbosidade não parece afetar significativamente a dançabilidade.
  • Verbosidade não seria a real razão da significativa dançabilidade das músicas de Jackson, o qual é notório pela batida e ritmo de suas músicas (tendo sido nomeado até maior ritmista da história da música popular brasileira).

Como o passar dos anos afeta o tempo de duração da música?

m <- list(
  l =70,
  b = 150)
p <- data %>% 
    ggplot(aes(x=as.factor(album_release_year),
               duration_s,
               group=album_release_year,
               color=remaster)) +
    geom_boxplot(position = "dodge", alpha=0.6) +
    theme(axis.text.x = element_text(angle = 30, hjust = 1))
ggplotly(p) %>%
     layout(autosize = F, margin=m)

Olhando para os álbuns originais (remaster = FALSE) é possível perceber um grande aumento no tempo de duração das músicas no álbum em 1967 seguido de uma diminuição no álbum seguinte 1968. Esse choque no perfil dos dois álbuns requer uma explicação que não está nos dados.

O álbum de 1967 A Braza do Norte, primeiro gravado na gravadora Cantagalo marca também um momento especial na vida do cantor, pois esse é o ano de seu divórcio de Almira, parceira na música e esposa. De músicas mais longas e de faixas de letra mais triste como “Passarinho abandonado” composta pelo próprio Jackson, esse perfil incomum do álbum acaba por refletir esse momento da vida do cantor.

O álbum de 1968 por outro lado é uma coletânea e reúne algumas das músicas até então mais populares (e tambpem curtas do cantor). Essa coletânea casa com um inaudito porém curto hiato do cantor que pela primeira vez passa um ano sem publicar um álbum, o qual pode ser atribuído ao seu divórcio.

  • Os álbuns remasterizados/relançados reúnem faixas algumas vezes de diferentes momentos da carreira do cantor, e por isso fica difícil atribuir um significado pertinente à duração de suas faixas.

Os albuns relançados/remasterizados são mais populares?

# lollipop chart
m <- list(
  l = 370)
p <- data %>%
        ggplot(aes(album_popularity,y=reorder(album_name,album_popularity),
                   color=remaster,
                   group=remaster)) +
            geom_segment(aes(x = 0, y = reorder(album_name,album_popularity), 
                             xend = album_popularity, 
                             yend = album_name)) + 
        geom_point() +
        theme(axis.title.y=element_blank())
ggplotly(p,tooltip=NA) %>%
  layout(autosize = F,
         margin = m)

Fica evidente que para Jackson do Pandeiro os álbuns remasterizados/relançados dominam o cenário do Spotify em termos de popularidade. Primeiramente, simplesmente observando a proporção entre remasterizados e não remasterizados fica evidente que os primeiros são os que o Spotify mais disponibiliza. Segundo, levando em consideração a questão de qualidade de áudio era de se esperar que os remasterizados tomassem a dianteira.

Como o tempo afeta a distribuição das notas musicais ?

tim12equal = c("#00008F", "#0000EA", "#0047FF", "#00A2FF", "#00FEFF", "#5AFFA5", "#B5FF4A", "#FFED00", "#FF9200", "#FF3700", "#DB0000", "#800000")
m <- list(
    l=80,
    r=30);
p <-  data %>%
    select(key,album_release_date, remaster) %>%
    group_by(album_release_date,key,remaster) %>%
    summarise(count = n()) %>%
    mutate(prop = count/sum(count)) %>%
    ungroup() %>%
    ggplot(aes(x = factor(album_release_date), 
               y = count, fill = key,
               text = paste(
                    "Proporção:", count * 10,"%"
                     ))) +
    geom_bar(stat = "identity", position = "fill", width = .7)  +
    scale_y_continuous(labels = scales::percent) +
    scale_fill_manual(values = tim12equal) +
    theme(axis.text.x = element_text(angle = 30, hjust = 1))  +
    theme(axis.title.x=element_blank(),
          axis.title.y=element_blank()) +
    facet_grid(remaster ~ .) +
    ggtitle("Notas musicais (distinção por remasterização)") +
    guides(fill=guide_legend(title=""))
ggplotly(p, tooltip="text") %>%
      layout(autosize = F,
             margin = m,
             legend = list(
      orientation = "h", y =-0.2
    ))
  • É possível ver que no começo dos anos 1960 ínicio as músicas na escala entre E e G dominam fortemente o repertório de Jackson, curiosamente quando as músicas de notas entre A e C chegam a ocupar metade das ocorrências.
    • Isso está de acordo com o perfil de Jackson, notório por sua heterogeneidade, além disso o álbum de 1967 como foi dito anteriormente representa uma mudança no tom do cantor também por motivos pessoais (seu divórcio).
  • Os álbuns remasterizados refletem uma grande variação em termos de notas musicais já esperada dado que esse conjuto reúne uma quase caótica série de coletâneas, seleções diversas e relançamentos que acabam misturando momentos diferentes da carreira do cantor.
    • O fato de Jackson se entregar a diversos estilos musicais śo multiplica essa variação em termos de notas musicais (Jackson se envolveu com baião, xote, xaxado, coco, arrastapé, quadrilha, marcha, frevo, e outros), isso fica evidente na variação já nos álbuns não remasterizados.
LS0tCnRpdGxlOiAiSmFja3NvbiAtIE8gcmVpIGRvIFJpdG1vIgpzdWJ0aXRsZTogJ0Fuw6FsaXNlIHNvYnJlIEphY2tzb24gZG8gUGFuZGVpcm8gKFNwb3RpZnkpJwphdXRob3I6ICJKb3PDqSBCZW5hcmRpIGRlIFNvdXphIE51bmVzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCiMjIENvbmp1bnRvIGRlIGRhZG9zIHV0aWxpemFkbwoKQW7DoWxpc2UgZXhwbG9yYXTDs3JpYSBkZSBkYWRvcyBkbyBbU3BvdGlmeV0oaHR0cHM6Ly93d3cuc3BvdGlmeS5jb20vYnIvKSAgc29icmUgb3Mgw6FsYnVucyBlIG3DunNpY2FzIGRlIEphY2tzb24gZG8gUGFuZGVpcm8gU3RyZWFtaW5nLiBPcyBkYWRvcyBvcmlnaW5haXMgZSBhcyB2YXJpw6F2ZWlzIHbDqm0gW2Rlc3RlIHJlcG9zaXRvcmlvXShodHRwczovL2dpdGh1Yi5jb20vY2llbmNpYWRlZGFkb3MtdWZjZy92aXMtY2FuY29lcykgLiBBIGV4cGxpY2HDp8OjbyBkZSBjb21vIG9zIGRhZG9zIGZvcmFtIGdlcmFkb3MgZXN0w6EgZGlzcG9uw612ZWwgW25hIGRvY3VtZW50YcOnw6NvIGRhIEFQSSBkbyBTcG90aWZ5XShodHRwczovL2JldGEuZGV2ZWxvcGVyLnNwb3RpZnkuY29tL2RvY3VtZW50YXRpb24vd2ViLWFwaS9yZWZlcmVuY2Uvb2JqZWN0LW1vZGVsLyNhdWRpby1mZWF0dXJlcy1vYmplY3QpLgoKIyMjIENvbnNpZGVyYcOnw7VlcwoKTmEgYW7DoWxpc2UgYWJhaXhvIGZvaSBwb3Nzw612ZWwgcGVyY2ViZXI6CgoqIENvbW8gYSBmYWxhIG7Do28gw6kgYSBncmFuZGUgcXVlc3TDo28gbmEgZGFuw6dhYmlsaWRhZGUgZGFzIG3DunNpY2FzIGRlIEphY2tzb24sIG8gcXVlIGVyYSBkZSBzZSBlc3BlcmFyIGRvICoqUmVpIGRvIFJpdG1vKiouIAoqIFZpbW9zIGNvbW8gbm8gU3BvdGlmeSBhIG1haW9yIHBhcnRlIGRvcyDDoWxidW5zIHPDo28gcmVtYXN0ZXJpemFkb3MvcmVsYW7Dp2Fkb3MgZSBlc3RlcyAgc8OjbyBvcyBtYWlzIHBvcHVsYXJlcy4gCiogRm9pIHBvc3PDrXZlbCB2aXNsdW1icmFyIGEgaW5jcsOtdmVsIGRpdmVyc2lkYWRlIGRvIGNhbnRvciBxdWUgbm9zIGZvaSByZWFmaXJtYWRhIGVtIHRlcm1vcyBkZSBub3RhcyBtdXNpY2FpcyBlIGRlIGR1cmHDp8Ojby4KKiBQb3IgZmltLCBmb2kgcG9zc8OtdmVsIHBlcmNlYmVyIGNvbW8gbyB0b20gZSBtZXNtbyBhIGR1cmHDp8OjbyBkYXMgZmFpeGFzIGRlIEphY2tzb24gbsOjbyByZXByZXNlbnRhbSBzb21lbnRlIGEgaW5jcsOtdmVsIGRpdmVyc2lkYWRlIGRlIHN1YSBtw7pzaWNhLCBtYXMgdGFtYsOpbSByZWZsZXRlbSBzdWEgdmlkYSBwZXNzb2FsLiBVbSBldmVudG8gZGUgbmF0dXJlemEgcGVzc29hbCBhZmV0YSB2aXNpdmVsbWVudGUgbyB0b20gZGUgc3VhIG3DunNpY2EuCgpgYGB7ciBzZXR1cCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZHBseXIsIHdhcm4uY29uZmxpY3RzID0gRkFMU0UpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQpsaWJyYXJ5KHN0cmluZ3IpCnRoZW1lX3NldCh0aGVtZV9idygpKQpgYGAKCiMjIERhdGEgT3ZlcnZpZXcKCmBgYHtyfQpkYXRhIDwtIHJlYWRfY3N2KGhlcmU6OmhlcmUoImRhdGEvamFja3Nvbi5jc3YiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gY29sX2RvdWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX3VyaSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV9uYW1lID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX2ltZyA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bV9yZWxlYXNlX2RhdGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1fcmVsZWFzZV95ZWFyID0gY29sX2RhdGUoZm9ybWF0ID0gIiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtX3BvcHVsYXJpdHkgPSBjb2xfaW50ZWdlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX25hbWUgPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdXJpID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfc2lnbmF0dXJlID0gY29sX2ludGVnZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfbW9kZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19wb3B1bGFyaXR5ID0gY29sX2ludGVnZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpICU+JQogICAgICAgICBtdXRhdGUoYWxidW1fbmFtZSA9IGdzdWIoIi4qKDE5NTQpLioiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgTXVzaWMgb2YgQnJhemlsL0phY2tzb24gZG8gUGFuZGVpcm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1fbmFtZSkpOwpkYXRhICU+JSAKICAgIGdsaW1wc2UoKQpgYGAKCiMjIyBEYW7Dp2FiaWxpZGFkZSAoZGFuY2VhYmlsaXR5KQoKYGBge3J9CmRhdGEgJT4lIAogICAgZ2dwbG90KGFlcyhzYW1wbGU9ZGFuY2VhYmlsaXR5KSkgKyAKICAgICAgICBzdGF0X3FxKCkKYGBgCgpgYGB7cn0KaGNoYXJ0IChkYXRhJGRhbmNlYWJpbGl0eSwKICAgICAgICBjb2xvciA9ICIjQjcxQzFDIiwKICAgICAgICBuYW1lID0gIkRhbsOnYWJpbGlkYWRlIikKYGBgCgoqIE5lbmh1bSB2YWxvciBmb3JhIGRvIGRvbcOtbmlvIGRvcyB2YWxvcmVzLCBhIGRhbsOnYWJpbGlkYWRlIHBhcmVjZSBnaXJhciBlbSB0b3JubyBkZSAwLjYgZSAwLjcuCgojIyMgVmVyYm9zaWRhZGUgKHNwZWVjaGluZXMpCgpgYGB7cn0KZGF0YSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHNhbXBsZT1zcGVlY2hpbmVzcykpICsgCiAgICAgICAgc3RhdF9xcSgpCmBgYAoKYGBge3J9CmhjaGFydCAoZGF0YSRzcGVlY2hpbmVzcywKICAgICAgICBjb2xvciA9ICIjQjcxQzFDIiwKICAgICAgICBuYW1lID0gIlZlcmJvc2lkYWRlIikKYGBgCgoqIE5lbmh1bSB2YWxvciBmb3JhIGRvIGRvbcOtbmlvIGRvcyB2YWxvcmVzLiBBIHZlcmJvc2lkYWRlIMOpIGVtIGdlcmFsIGJhaXhhLCBvYnNlcnZhbmRvIGEgbcO6c2ljYSBkZSBKYWNrc29uIG8gcml0bW8gcGFyZWNlIHNlciBhIHF1ZXN0w6NvIHByaW5jaXBhbCwgY29tIGxldHJhcyBjdXJ0YXMgZSBxdWFzZSByZXBldGl0aXZhcy4KCiMjIyBEdXJhw6fDo28gKGR1cmF0aW9uKQoKYGBge3J9CmRhdGEgPC0gZGF0YSAlPiUKICAgIG11dGF0ZShkdXJhdGlvbl9zID0gZHVyYXRpb25fbXMvMTAwMCkKCmRhdGEgJT4lIAogICAgc2VsZWN0KGR1cmF0aW9uX3MpICU+JQogICAgZ2xpbXBzZSgpCmBgYAoKCmBgYHtyfQpkYXRhICU+JSAKICAgIGdncGxvdChhZXMoc2FtcGxlPWR1cmF0aW9uX3MpKSArIAogICAgICAgIHN0YXRfcXEoKQpgYGAKCmBgYHtyfQpoY2hhcnQgKGRhdGEkZHVyYXRpb25fcywKICAgICAgICBjb2xvciA9ICIjQjcxQzFDIiwKICAgICAgICBuYW1lID0gIkR1cmHDp8OjbyAocykiKQpgYGAKCiogTmVuaHVtIHZhbG9yIGZvcmEgZG8gZG9tw61uaW8gZG9zIHZhbG9yZXMuIEFzIG3DunNpY2FzIGdpcmFtIGVtIHRvcm5vIGRlIDE2MCBzZWd1bmRvcyAoMiBtaW51dG9zIGUgNDAgc2VndW5kb3MpLCBhcyBtw7pzaWNhcyBkZSBKYWNrc29uIHPDo28gZW0gZ2VyYWwgY3VydGFzLgoKIyMjIFJlbWFzdGVyaXphw6fDo28gKHJlbWFzdGVyKQoKCmBgYHtyfQpkYXRhIDwtIGRhdGEgJT4lCiAgICBtdXRhdGUocmVtYXN0ZXIgPSBhbGJ1bV9yZWxlYXNlX2RhdGUgPiAiMTk4MS0zMC0xMiIpCgpkYXRhICU+JSAKICAgIHNlbGVjdChhbGJ1bV9uYW1lLCBhbGJ1bV9yZWxlYXNlX3llYXIsIHJlbWFzdGVyKSAlPiUKICAgIHNhbXBsZV9uKDEwKQpgYGAKCgpgYGB7cn0KdGVtcCA8LSBkYXRhICU+JSAKICAgIGRpc3RpbmN0KGFsYnVtX25hbWUsCiAgICAgICAgICAgICAua2VlcF9hbGwgPSBUUlVFKSAlPiUKICAgIG11dGF0ZShyZW1hc3RlciA9IGlmZWxzZShyZW1hc3RlciA9PSBUUlVFLCJyZW1hc3Rlcml6YWRvIiwib3JpZ2luYWwiKSkKCmhjaGFydCh0ZW1wJHJlbWFzdGVyLAogICAgICAgY29sb3JCeVBvaW50ID0gVFJVRSwKICAgICAgIG5hbWU9IsOBbGJ1bSIpCmBgYAoKKiDDgWxidW5zIHJlbWFzdGVyaXphZG9zL3JlbGFuw6dhZG9zIHPDo28gbXVpdG8gbWFpcyBmcmVxdWVudGVzLgoKYGBge3J9CnRlbXAgPC0KICAgIGRhdGEgJT4lIAogICAgZGlzdGluY3QoYWxidW1fbmFtZSwgLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgICBncm91cF9ieShhbGJ1bV9yZWxlYXNlX3llYXIpICU+JQogICAgc3VtbWFyaXNlKG9yaWdpbmFsX24gPSBzdW0oIXJlbWFzdGVyKSwKICAgICAgICAgICAgICByZW1hc3Rlcl9uID0gc3VtKHJlbWFzdGVyKSkKCmhpZ2hjaGFydCgpICU+JQoKICBoY194QXhpcyhjYXRlZ29yaWVzID0gdGVtcCRhbGJ1bV9yZWxlYXNlX3llYXIpICU+JQogIGhjX2FkZF9zZXJpZXModGVtcCRvcmlnaW5hbF9uLCAKICAgICAgICAgICAgICAgIHR5cGUgPSAiY29sdW1uIiwKICAgICAgICAgICAgICAgIGNvbG9yID0gIiNCNzFDMUMiLAogICAgICAgICAgICAgICAgbmFtZSA9ICJOw6NvIHJlbWFzdGVyaXphZG8iKSAlPiUKICBoY19hZGRfc2VyaWVzKHRlbXAkcmVtYXN0ZXJfbiwgCiAgICAgICAgICAgICAgICB0eXBlID0gImNvbHVtbiIsCiAgICAgICAgICAgICAgICBuYW1lID0gIlJlbWFzdGVyaXphZG8iKSAgJT4lCiAgICAgIGhjX3RpdGxlKHRleHQgPSAiTsO6bWVybyBkZSDDoWxidW5zIHBvciBhbm8iKQoKYGBgCgoqIE8gYW5vIGRlIDIwMTYgcmVwcmVzZW50YSB1bSBhdW1lbnRvIGFsdMOtc3NpbW8gbmEgZGlzcG9uaWJpbGl6YcOnw6NvIGRlIMOhbGJ1bnMgZGUgSmFja3NvbiBubyBTcG90aWZ5LiAKCiMjIE1haXMgZGlzY3Vyc28vZGnDoWxvZ28gKHNwZWVjaGluZXMpIHRlbSBlZmVpdG8gc29icmUgYSBkYW7Dp2FiaWxpZGFkZSBkYSBtw7pzaWNhPwoKYGBge3J9CnAgPC0gZGF0YSAlPiUgCiAgICAgICAgZGlzdGluY3QodHJhY2tfbmFtZSwgLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgICAgICAgZ2dwbG90KGFlcyh4PXNwZWVjaGluZXNzLAogICAgICAgICAgICAgICAgICAgeT1kYW5jZWFiaWxpdHkpKSArCiAgICAgICAgZ2VvbV9wb2ludChhbHBoYT0wLjQpIAoKZ2dwbG90bHkocCkKYGBgCgo8YnI+PC9icj4KCk7Do28gcGFyZWNlIGhhdmVyIHVtYSByZWxhw6fDo28gY2xhcmEgZW50cmUgYSBkYW7Dp2FiaWxpZGFkZSBkYXMgbcO6c2ljYXMgZGUgSmFja3NvbiBlIGEgdmVyYm9zaWRhZGUgZGUgc3VhcyBtw7pzaWNhcy4gVGVtb3MgbXVpdGFzIGZhaXhhcyBkZSBkaWZlcmVudGUgZ3JhdSBkZSBkYW7Dp2FiaWxpZGFkZSBkZSBtZXNtbyBncmF1IGJhaXhvIGRlIHZlcmJvc2lkYWRlLiAgClF1YW5kbyBhdW1lbnRhbW9zIGEgdmVyYm9zaWRhZGUgZGFzIG3DunNpY2FzIChtYWlzIMOgIGRpcmVpdGEgbm8gZWl4bykgYSBkYW7Dp2FiaWxpZGFkZSBzZSBtYW50w6ltIHJlbGF0aXZhbWVudGUgZXN0w6F2ZWwgKE8gYXVtZW50byBuYSBkYW7Dp2FiaWxpZGFkZSDDqSBtYXJnaW5hbCkuICAKCgpgYGB7cn0KZGF0YSAlPiUgCiAgICBkaXN0aW5jdCh0cmFja19uYW1lLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUKICAgIGdncGxvdChhZXMoc3BlZWNoaW5lc3MsZGFuY2VhYmlsaXR5KSkgKwogICAgc3RhdF9kZW5zaXR5MmQoYWVzKGZpbGwgPSAuLmxldmVsLi4pLCBnZW9tID0gInBvbHlnb24iKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMSwwLjAxKSkKCmBgYAoKPGJyPjwvYnI+CgrDiSBwb3Nzw612ZWwgdmVyIG1haXMgY2xhcmFtZW50ZSBxdWUgbyBwb250byBkZSBtYWlvciBvY29ycsOqbmNpYSAoY3VtZSBvdSBwb250byBkZSBsZXZlbCBtYWlzIGFsdG8pIMOpIGVtIGVtIHRvcm5vIGRlIDAuNyBkZSBkYW7Dp2FiaWxpZGFkZSBlIGRlIGFwcm94aW1hZGFtZW50ZSAwLjA0ICh2YWxvcmVzIG11aXRvIGJhaXhvIGRlIHZlcmJvc2lkYWRlKS4gICAKSXNzbyBpbXBsaWNhIGVtIGFsZ28gasOhIGVzcGVyYWRvLCBKYWNrc29uIG7Do28gcHJlY2lzYSBmYWxhciBtdWl0byBwcmEgdG9ybmFyIHN1YXMgbcO6c2ljYXMgZGFuw6dhbnRlcywgbsOjbyDDqSBhIHRvYSBxdWUgSmFja3NvbiBnYW5ob3UgYSBhbGN1bmhhIGRlIFJlaSBkbyBSaXRtby4gCgoqIE8gYXVtZW50byBlbSB2ZXJib3NpZGFkZSBuw6NvIHBhcmVjZSBhZmV0YXIgc2lnbmlmaWNhdGl2YW1lbnRlIGEgZGFuw6dhYmlsaWRhZGUuCiogVmVyYm9zaWRhZGUgbsOjbyBzZXJpYSBhIHJlYWwgcmF6w6NvIGRhIHNpZ25pZmljYXRpdmEgZGFuw6dhYmlsaWRhZGUgZGFzIG3DunNpY2FzIGRlIEphY2tzb24sIG8gcXVhbCDDqSBub3TDs3JpbyBwZWxhIGJhdGlkYSBlIHJpdG1vIGRlIHN1YXMgbcO6c2ljYXMgKHRlbmRvIHNpZG8gbm9tZWFkbyBhdMOpIG1haW9yIHJpdG1pc3RhIGRhIGhpc3TDs3JpYSBkYSBtw7pzaWNhIHBvcHVsYXIgYnJhc2lsZWlyYSkuICAgICAKCiMjIENvbW8gbyBwYXNzYXIgZG9zIGFub3MgYWZldGEgbyB0ZW1wbyBkZSBkdXJhw6fDo28gZGEgbcO6c2ljYT8KCmBgYHtyfQptIDwtIGxpc3QoCiAgbCA9NzAsCiAgYiA9IDE1MCkKCnAgPC0gZGF0YSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9YXMuZmFjdG9yKGFsYnVtX3JlbGVhc2VfeWVhciksCiAgICAgICAgICAgICAgIGR1cmF0aW9uX3MsCiAgICAgICAgICAgICAgIGdyb3VwPWFsYnVtX3JlbGVhc2VfeWVhciwKICAgICAgICAgICAgICAgY29sb3I9cmVtYXN0ZXIpKSArCiAgICBnZW9tX2JveHBsb3QocG9zaXRpb24gPSAiZG9kZ2UiLCBhbHBoYT0wLjYpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpCgpnZ3Bsb3RseShwKSAlPiUKICAgICBsYXlvdXQoYXV0b3NpemUgPSBGLCBtYXJnaW49bSkKYGBgCgpPbGhhbmRvIHBhcmEgb3Mgw6FsYnVucyBvcmlnaW5haXMgKHJlbWFzdGVyID0gRkFMU0UpIMOpIHBvc3PDrXZlbCBwZXJjZWJlciB1bSBncmFuZGUgYXVtZW50byBubyB0ZW1wbyBkZSBkdXJhw6fDo28gZGFzIG3DunNpY2FzIG5vIMOhbGJ1bSBlbSAxOTY3IHNlZ3VpZG8gZGUgdW1hIGRpbWludWnDp8OjbyBubyDDoWxidW0gc2VndWludGUgMTk2OC4gRXNzZSBjaG9xdWUgbm8gcGVyZmlsIGRvcyBkb2lzIMOhbGJ1bnMgcmVxdWVyIHVtYSBleHBsaWNhw6fDo28gcXVlIG7Do28gZXN0w6Egbm9zIGRhZG9zLgoKTyDDoWxidW0gZGUgMTk2NyAqKkEgQnJhemEgZG8gTm9ydGUqKiwgcHJpbWVpcm8gZ3JhdmFkbyBuYSBncmF2YWRvcmEgQ2FudGFnYWxvIG1hcmNhIHRhbWLDqW0gdW0gbW9tZW50byBlc3BlY2lhbCBuYSB2aWRhIGRvIGNhbnRvciwgcG9pcyBlc3NlIMOpIG8gYW5vIGRlIHNldSBkaXbDs3JjaW8gZGUgQWxtaXJhLCBwYXJjZWlyYSBuYSBtw7pzaWNhIGUgZXNwb3NhLiBEZSBtw7pzaWNhcyBtYWlzIGxvbmdhcyBlIGRlIGZhaXhhcyBkZSBsZXRyYSBtYWlzIHRyaXN0ZSBjb21vICoqIlBhc3NhcmluaG8gYWJhbmRvbmFkbyIqKiBjb21wb3N0YSBwZWxvIHByw7NwcmlvIEphY2tzb24sIGVzc2UgcGVyZmlsIGluY29tdW0gZG8gw6FsYnVtIGFjYWJhIHBvciByZWZsZXRpciBlc3NlIG1vbWVudG8gZGEgdmlkYSBkbyBjYW50b3IuCgpPIMOhbGJ1bSBkZSAxOTY4IHBvciBvdXRybyBsYWRvIMOpIHVtYSBjb2xldMOibmVhIGUgcmXDum5lIGFsZ3VtYXMgZGFzIG3DunNpY2FzIGF0w6kgZW50w6NvIG1haXMgcG9wdWxhcmVzIChlIHRhbWJwZW0gY3VydGFzIGRvIGNhbnRvcikuIEVzc2EgY29sZXTDom5lYSBjYXNhIGNvbSB1bSBpbmF1ZGl0byBwb3LDqW0gY3VydG8gaGlhdG8gZG8gY2FudG9yIHF1ZSBwZWxhIHByaW1laXJhIHZleiBwYXNzYSB1bSBhbm8gc2VtIHB1YmxpY2FyIHVtIMOhbGJ1bSwgbyBxdWFsIHBvZGUgc2VyIGF0cmlidcOtZG8gYW8gc2V1IGRpdsOzcmNpby4KCiogT3Mgw6FsYnVucyByZW1hc3Rlcml6YWRvcy9yZWxhbsOnYWRvcyByZcO6bmVtIGZhaXhhcyBhbGd1bWFzIHZlemVzIGRlIGRpZmVyZW50ZXMgbW9tZW50b3MgZGEgY2FycmVpcmEgZG8gY2FudG9yLCBlIHBvciBpc3NvIGZpY2EgZGlmw61jaWwgYXRyaWJ1aXIgdW0gc2lnbmlmaWNhZG8gcGVydGluZW50ZSDDoCBkdXJhw6fDo28gZGUgc3VhcyBmYWl4YXMuIAoKCiMjIE9zIGFsYnVucyByZWxhbsOnYWRvcy9yZW1hc3Rlcml6YWRvcyBzw6NvIG1haXMgcG9wdWxhcmVzPyAKCmBgYHtyfQojIGxvbGxpcG9wIGNoYXJ0Cm0gPC0gbGlzdCgKICBsID0gMzcwKQoKcCA8LSBkYXRhICU+JQogICAgICAgIGdncGxvdChhZXMoYWxidW1fcG9wdWxhcml0eSx5PXJlb3JkZXIoYWxidW1fbmFtZSxhbGJ1bV9wb3B1bGFyaXR5KSwKICAgICAgICAgICAgICAgICAgIGNvbG9yPXJlbWFzdGVyLAogICAgICAgICAgICAgICAgICAgZ3JvdXA9cmVtYXN0ZXIpKSArCiAgICAgICAgICAgIGdlb21fc2VnbWVudChhZXMoeCA9IDAsIHkgPSByZW9yZGVyKGFsYnVtX25hbWUsYWxidW1fcG9wdWxhcml0eSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhlbmQgPSBhbGJ1bV9wb3B1bGFyaXR5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZW5kID0gYWxidW1fbmFtZSkpICsgCiAgICAgICAgZ2VvbV9wb2ludCgpICsKICAgICAgICB0aGVtZShheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpKQoKZ2dwbG90bHkocCx0b29sdGlwPU5BKSAlPiUKICBsYXlvdXQoYXV0b3NpemUgPSBGLAogICAgICAgICBtYXJnaW4gPSBtKQpgYGAKCkZpY2EgZXZpZGVudGUgcXVlIHBhcmEgSmFja3NvbiBkbyBQYW5kZWlybyAqKm9zIMOhbGJ1bnMgcmVtYXN0ZXJpemFkb3MvcmVsYW7Dp2Fkb3MgZG9taW5hbSBvIGNlbsOhcmlvIGRvIFNwb3RpZnkgZW0gdGVybW9zIGRlIHBvcHVsYXJpZGFkZSoqLiAKUHJpbWVpcmFtZW50ZSwgc2ltcGxlc21lbnRlIG9ic2VydmFuZG8gYSBwcm9wb3LDp8OjbyBlbnRyZSByZW1hc3Rlcml6YWRvcyBlIG7Do28gcmVtYXN0ZXJpemFkb3MgZmljYSBldmlkZW50ZSBxdWUgb3MgcHJpbWVpcm9zIHPDo28gb3MgcXVlIG8gU3BvdGlmeSBtYWlzIGRpc3BvbmliaWxpemEuIFNlZ3VuZG8sIGxldmFuZG8gZW0gY29uc2lkZXJhw6fDo28gYSBxdWVzdMOjbyBkZSBxdWFsaWRhZGUgZGUgw6F1ZGlvIGVyYSBkZSBzZSBlc3BlcmFyIHF1ZSBvcyByZW1hc3Rlcml6YWRvcyB0b21hc3NlbSBhIGRpYW50ZWlyYS4KCiMjIENvbW8gbyB0ZW1wbyBhZmV0YSBhIGRpc3RyaWJ1acOnw6NvIGRhcyBub3RhcyBtdXNpY2FpcyA/CgpgYGB7cn0KdGltMTJlcXVhbCA9IGMoIiMwMDAwOEYiLCAiIzAwMDBFQSIsICIjMDA0N0ZGIiwgIiMwMEEyRkYiLCAiIzAwRkVGRiIsICIjNUFGRkE1IiwgIiNCNUZGNEEiLCAiI0ZGRUQwMCIsICIjRkY5MjAwIiwgIiNGRjM3MDAiLCAiI0RCMDAwMCIsICIjODAwMDAwIikKCgptIDwtIGxpc3QoCiAgICBsPTgwLAogICAgcj0zMCk7CgpwIDwtICBkYXRhICU+JQogICAgc2VsZWN0KGtleSxhbGJ1bV9yZWxlYXNlX2RhdGUsIHJlbWFzdGVyKSAlPiUKICAgIGdyb3VwX2J5KGFsYnVtX3JlbGVhc2VfZGF0ZSxrZXkscmVtYXN0ZXIpICU+JQogICAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUKICAgIG11dGF0ZShwcm9wID0gY291bnQvc3VtKGNvdW50KSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoYWxidW1fcmVsZWFzZV9kYXRlKSwgCiAgICAgICAgICAgICAgIHkgPSBjb3VudCwgZmlsbCA9IGtleSwKICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlKAogICAgICAgICAgICAgICAgICAgICJQcm9wb3LDp8OjbzoiLCBjb3VudCAqIDEwLCIlIgogICAgICAgICAgICAgICAgICAgICApKSkgKwogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiLCB3aWR0aCA9IC43KSAgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gdGltMTJlcXVhbCkgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxKSkgICsKICAgIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpKSArCiAgICBmYWNldF9ncmlkKHJlbWFzdGVyIH4gLikgKwogICAgZ2d0aXRsZSgiTm90YXMgbXVzaWNhaXMgKGRpc3RpbsOnw6NvIHBvciByZW1hc3Rlcml6YcOnw6NvKSIpICsKICAgIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZCh0aXRsZT0iIikpCgpnZ3Bsb3RseShwLCB0b29sdGlwPSJ0ZXh0IikgJT4lCiAgICAgIGxheW91dChhdXRvc2l6ZSA9IEYsCiAgICAgICAgICAgICBtYXJnaW4gPSBtLAogICAgICAgICAgICAgbGVnZW5kID0gbGlzdCgKICAgICAgb3JpZW50YXRpb24gPSAiaCIsIHkgPS0wLjIKICAgICkpCgpgYGAKCiogw4kgcG9zc8OtdmVsIHZlciBxdWUgbm8gY29tZcOnbyBkb3MgYW5vcyAxOTYwIMOtbmljaW8gYXMgbcO6c2ljYXMgbmEgZXNjYWxhIGVudHJlIEUgZSBHIGRvbWluYW0gZm9ydGVtZW50ZSBvIHJlcGVydMOzcmlvIGRlIEphY2tzb24sIGN1cmlvc2FtZW50ZSBxdWFuZG8gYXMgbcO6c2ljYXMgZGUgbm90YXMgZW50cmUgQSBlIEMgY2hlZ2FtIGEgb2N1cGFyIG1ldGFkZSBkYXMgb2NvcnLDqm5jaWFzLiAgIAogICAgKyBJc3NvIGVzdMOhIGRlIGFjb3JkbyBjb20gbyBwZXJmaWwgZGUgSmFja3Nvbiwgbm90w7NyaW8gcG9yIHN1YSBoZXRlcm9nZW5laWRhZGUsIGFsw6ltIGRpc3NvIG8gw6FsYnVtIGRlIDE5NjcgY29tbyBmb2kgZGl0byBhbnRlcmlvcm1lbnRlIHJlcHJlc2VudGEgdW1hIG11ZGFuw6dhIG5vIHRvbSBkbyBjYW50b3IgdGFtYsOpbSBwb3IgbW90aXZvcyBwZXNzb2FpcyAoc2V1IGRpdsOzcmNpbykuICAKICogT3Mgw6FsYnVucyByZW1hc3Rlcml6YWRvcyByZWZsZXRlbSB1bWEgZ3JhbmRlIHZhcmlhw6fDo28gZW0gdGVybW9zIGRlIG5vdGFzIG11c2ljYWlzIGrDoSBlc3BlcmFkYSBkYWRvIHF1ZSBlc3NlIGNvbmp1dG8gcmXDum5lIHVtYSBxdWFzZSBjYcOzdGljYSBzw6lyaWUgZGUgY29sZXTDom5lYXMsIHNlbGXDp8O1ZXMgZGl2ZXJzYXMgZSByZWxhbsOnYW1lbnRvcyBxdWUgYWNhYmFtIG1pc3R1cmFuZG8gbW9tZW50b3MgZGlmZXJlbnRlcyBkYSBjYXJyZWlyYSBkbyBjYW50b3IuICAKICAgICsgTyBmYXRvIGRlIEphY2tzb24gc2UgZW50cmVnYXIgYSBkaXZlcnNvcyBlc3RpbG9zIG11c2ljYWlzIMWbbyBtdWx0aXBsaWNhIGVzc2EgdmFyaWHDp8OjbyBlbSB0ZXJtb3MgZGUgbm90YXMgbXVzaWNhaXMgKEphY2tzb24gc2UgZW52b2x2ZXUgY29tIGJhacOjbywgeG90ZSwgeGF4YWRvLCBjb2NvLCBhcnJhc3RhcMOpLCBxdWFkcmlsaGEsIG1hcmNoYSwgZnJldm8sICoqZSBvdXRyb3MqKiksIGlzc28gZmljYSBldmlkZW50ZSBuYSB2YXJpYcOnw6NvIGrDoSBub3Mgw6FsYnVucyBuw6NvIHJlbWFzdGVyaXphZG9zLgo=